home *** CD-ROM | disk | FTP | other *** search
/ Atari Forever 4 / Atari Forever 4.zip / Atari Forever 4.iso / PD_THEMA / GRAFIK / GEOCAD / GEODSK_B / FPU / PRTKL881.S < prev    next >
Text File  |  1998-03-14  |  11KB  |  283 lines

  1. ; PRTKL881 - Protokoll für M68881 - Version 1.0
  2. ; programmiert von Volker Hemsen, August 1993, Public Domain
  3.  
  4. ; Dieses Programm ist Public Domain! Es ist unverkäuflich und darf von jeder-
  5. ; man benutzt und kopiert werden. Es ist unverkäuflich!
  6. ; Hiermit wird ausdrücklich erlaubt, den Quellcode zu verändern und zu
  7. ; erweitern!
  8. ; Folgende Befehle werden nicht bearbeitet:
  9. ; fscc, fdbcc, ftrapcc, fbcc.l, fsave, frestore, fmovem
  10. ; verwendete Literatur: Atari Profibuch ST-STE-TT, Sybex Verlag
  11.  
  12.  
  13. fpstat            EQU $FFFFFA40           ; status register.w (R)
  14. fpctl             EQU $FFFFFA42           ; control register.w (W)
  15. fpsave            EQU $FFFFFA44           ; save register.w (R)
  16. fprestor          EQU $FFFFFA46           ; restore register.w (R/W)
  17. ;fpopw           EQU $FFFFFA48   ; operation word register (?).w
  18. fpcmd             EQU $FFFFFA4A           ; command register.w (W)
  19. ;fpres           EQU $FFFFFA4C   ; reserved.w
  20. fpccr             EQU $FFFFFA4E           ; condition code register.w (W)
  21. fpop              EQU $FFFFFA50           ; operand register.l (R/W)
  22. fpselct           EQU $FFFFFA54           ; register select.w (R)
  23. fpiadr            EQU $FFFFFA58           ; instruction address.l (W)
  24.  
  25.  
  26.                   TEXT
  27.  
  28.                   movea.l 4(SP),A0        ;Adresse der Basepage
  29.                   move.l  #$0100,D0       ;Länge der Basepage
  30.                   add.l   $0C(A0),D0      ;Länge des Textsegmentes
  31.                   add.l   $14(A0),D0      ;Länge des Datasegmentes
  32.                   add.l   $1C(A0),D0      ;Länge der BSS
  33.                   clr.w   -(SP)           ;Returnparameter
  34.                   move.l  D0,-(SP)        ;Länge übergeben
  35.                   move.w  #$31,-(SP)      ;Ptermres()
  36.  
  37.                   pea     hallo(PC)
  38.                   move.w  #9,-(SP)
  39.                   trap    #1
  40.                   addq.l  #6,SP
  41.  
  42.                   pea     linef_patch(PC)
  43.                   move.w  #$26,-(SP)
  44.                   trap    #14
  45.                   addq.l  #6,SP
  46.  
  47.                   trap    #1
  48.  
  49.  
  50. linef_patch:      move.l  $2C.w,old_linef
  51.                   move.l  #my_linef,$2C.w
  52.                   rts
  53.  
  54.                   DC.L 'XBRA'
  55.                   DC.L 'P881'
  56. old_linef:        DC.L 0
  57. my_linef:         movem.l D0-A6,register
  58.                   movea.l SP,A0           ;SP korrigieren
  59.                   subq.l  #6,A0
  60.                   move.l  A0,adressreg_sp
  61.                   movea.l 2(SP),A6        ;a6=Returnadresse
  62.                   move.l  A6,op_pc
  63.                   move.w  (A6)+,D7        ;d7=opcode
  64.                   move.w  D7,fpctl.w
  65.                   move.w  D7,D0
  66.                   andi.w  #$01C0,D0
  67.                   tst.w   D0
  68.                   beq.s   gruppe000
  69.                   cmpi.w  #$40,D0
  70.                   beq.s   gruppe001
  71.                   cmpi.w  #$80,D0
  72.                   beq.s   gruppe010
  73.                   bra.s   gruppe_ende
  74. gruppe001:        swap    D7
  75.                   move.w  (A6)+,D7
  76.                   move.w  D7,fpccr.w
  77.                   bra.s   gruppe_ende
  78. gruppe010:        move.w  D7,D0
  79.                   andi.w  #$3F,D0
  80.                   move.w  D0,fpccr.w
  81.                   bra.s   gruppe_ende
  82. gruppe000:        swap    D7
  83.                   move.w  (A6)+,D7
  84.                   move.w  D7,fpcmd.w      ;LowWord
  85. gruppe_ende:      bsr.s   response
  86.                   move.l  A6,2(SP)
  87.                   movem.l register(PC),D0-A6
  88.                   rte
  89.  
  90. response:         move.w  fpstat.w,D6     ;status
  91.                   move.w  D6,D0
  92.                   and.w   #$36FC,D0       ;eigentlich $3EFC
  93.                   tst.w   D0
  94.                   beq.s   resp_null
  95.                   move.w  D6,D0
  96.                   and.w   #$1800,D0
  97.                   cmp.w   #$1000,D0
  98.                   beq.s   resp_transdata
  99.                   move.w  D6,D0
  100.                   and.w   #$1FF0,D0
  101.                   cmp.w   #$0C00,D0
  102.                   beq.s   resp_transcpureg
  103.                   move.w  D6,D0
  104.                   and.w   #$1F00,D0
  105.                   cmp.w   #$0100,D0
  106.                   beq     resp_transfpureg
  107. resp_ende:        btst    #15,D6          ;Come again-Bit auf 0 prüfen
  108.                   bne.s   response
  109.                   btst    #1,D6           ;Process-Finished-Bit auf 1 testen
  110.                   beq.s   response
  111.                   rts
  112.  
  113. resp_null:        btst    #0,D6           ;True/False-Bit
  114.                   bne.s   resp_null_sprung
  115.                   bra.s   resp_ende
  116. resp_null_sprung: adda.w  (A6),A6         ;nur .w-Sprünge
  117.                   bra.s   resp_ende
  118.  
  119. resp_transdata:   moveq   #0,D5           ;d5=Länge
  120.                   move.b  D6,D5
  121.                   bsr.s   getea
  122.                   btst    #13,D6          ;Datenrichtung
  123.                   beq.s   resp_tdwrite
  124.                   cmp.b   #1,D5
  125.                   beq.s   resp_tdreadb
  126.                   cmp.b   #2,D5
  127.                   beq.s   resp_tdreadw
  128. resp_tdreadl:     move.l  fpop.w,(A0)+
  129.                   subq.b  #4,D5
  130.                   bgt.s   resp_tdreadl
  131.                   bra.s   resp_ende
  132. resp_tdreadb:     move.b  fpop.w,(A0)
  133.                   bra.s   resp_ende
  134. resp_tdreadw:     move.w  fpop.w,(A0)
  135.                   bra.s   resp_ende
  136. resp_tdwrite:     cmp.b   #1,D5
  137.                   beq.s   resp_tdwriteb
  138.                   cmp.b   #2,D5
  139.                   beq.s   resp_tdwritew
  140. resp_tdwritel:    move.l  (A0)+,fpop.w
  141.                   subq.b  #4,D5
  142.                   bgt.s   resp_tdwritel
  143.                   bra.s   resp_ende
  144. resp_tdwriteb:    move.b  (A0),fpop.w
  145.                   bra.s   resp_ende
  146. resp_tdwritew:    move.w  (A0),fpop.w
  147.                   bra.s   resp_ende
  148.  
  149. resp_transcpureg: lea     register(PC),A0
  150.                   move.w  D6,D0
  151.                   lsl.w   #2,D0
  152.                   ext.l   D0
  153.                   adda.l  D0,A0
  154.                   btst    #13,D6          ;Datenrichtung
  155.                   beq.s   resp_tcrwrite
  156.                   move.l  fpop.w,(A0)
  157.                   bra     resp_ende
  158. resp_tcrwrite:    move.l  (A0),fpop.w
  159.                   bra     resp_ende
  160.  
  161. resp_transfpureg:
  162.                   bra     resp_ende
  163.  
  164. getea:            move.l  D7,D0           ;opcode
  165.                   move.w  D7,D2
  166.                   lsr.w   #8,D2
  167.                   lsr.w   #2,D2
  168.                   and.w   #%111,D2        ;d2 = g : Längencodierung
  169.                   swap    D0
  170.                   move.w  D0,D1
  171.                   and.w   #%111,D1        ;d1 = R : Register
  172.                   lsr.w   #3,D0
  173.                   and.w   #%111,D0        ;d0 = M : Modus
  174.                   lsl.w   #2,D0
  175.                   lea     getea_adr(PC),A0 ;weitere Routine nach
  176.                   movea.l 0(A0,D0.w),A0   ;Modus auswählen
  177.                   jmp     (A0)
  178.  
  179. getea_d:          lea     datenreg(PC),A0 ;Datenregister direkt
  180.                   lsl.w   #2,D1
  181.                   cmpi.w  #%110,D2        ;byte?
  182.                   bne.s   getea_dnob
  183.                   addq.l  #3,A0
  184. getea_dnob:       cmpi.w  #%100,D2
  185.                   bne.s   getea_dnow
  186.                   addq.l  #2,A0
  187. getea_dnow:                               ;ext.l   D1
  188.                   adda.w  D1,A0
  189.                   rts
  190.  
  191. getea_a:          bset    #3,D1           ;Adressregister direkt
  192.                   bra.s   getea_d
  193.  
  194. getea_ai:         lea     adressreg(PC),A1 ;Adressregister indirekt
  195.                   lsl.w   #2,D1
  196.                   movea.l 0(A1,D1.w),A0
  197.                   rts
  198. getea_aip:        bsr.s   getea_ai        ;Adressregister indirekt (a)+
  199.                   add.l   D5,0(A1,D1.w)
  200.                   rts
  201. getea_aim:        bsr.s   getea_ai        ;Adressregister indirekt -(a)
  202.                   sub.l   D5,0(A1,D1.w)
  203.                   suba.l  D5,A0
  204.                   rts
  205. getea_aid:        bsr.s   getea_ai        ;Adressregister indirekt d(a)
  206.                   adda.w  (A6)+,A0
  207.                   rts
  208. getea_aidr:       bsr.s   getea_ai        ;Adressregister indirekt d(a,r.?)
  209. ;folgendes gilt auch für d(pc,r.?)
  210. getea_eidr:       move.w  (A6)+,D1        ;Zusatzwort holen
  211.                   move.w  D1,D0           ;offset addieren
  212.                   ext.w   D0
  213.                   adda.w  D0,A0
  214.                   move.w  D1,D0
  215.                   rol.w   #6,D0           ;Registernummer extrahieren und *4
  216.                   and.w   #%111100,D0
  217.                   lea     register(PC),A1
  218.                   adda.w  D0,A1
  219.                   btst    #11,D1
  220.                   bne.s   getea_aidrl
  221.                   adda.w  2(A1),A0
  222.                   rts
  223. getea_aidrl:      adda.l  (A1),A0
  224.                   rts
  225.  
  226. getea_erweitert:  lea     getea_adrerw(PC),A0
  227.                   lsl.w   #2,D1
  228.                   movea.l 0(A0,D1.w),A0   ;weitere Routine nach
  229.                   jmp     (A0)            ;Register auswählen
  230.  
  231. getea_wadr:       suba.l  A0,A0           ;Speicher direkt, kurz
  232.                   movea.w (A6)+,A0
  233.                   rts
  234. getea_ladr:       movea.l (A6)+,A0        ;Speicher direkt, lang
  235.                   rts
  236. getea_pcd:        movea.l A6,A0           ;a6 ist neuer PC!
  237.                   adda.w  (A6)+,A0
  238.                   rts
  239. getea_pcdr:       movea.l A6,A0
  240.                   bra.s   getea_eidr
  241.  
  242. getea_konst:      movea.l A6,A0           ;Adresse holen
  243.                   adda.l  D5,A6           ;A6 weiterschalten
  244.                   cmpi.w  #1,D5           ;auf Bytelänge testen
  245.                   bne.s   getea_konstrts
  246.                   addq.l  #1,A0
  247.                   addq.l  #1,A6
  248. getea_konstrts:   rts
  249.  
  250.  
  251.                   DATA
  252. getea_adr:        DC.L getea_d            ;0
  253.                   DC.L getea_a            ;1
  254.                   DC.L getea_ai           ;2
  255.                   DC.L getea_aip          ;3
  256.                   DC.L getea_aim          ;4
  257.                   DC.L getea_aid          ;5
  258.                   DC.L getea_aidr         ;6
  259.                   DC.L getea_erweitert    ;7
  260. getea_adrerw:     DC.L getea_wadr         ;7,0
  261.                   DC.L getea_ladr         ;7,1
  262.                   DC.L getea_pcd          ;7,2
  263.                   DC.L getea_pcdr         ;7,3
  264.                   DC.L getea_konst        ;7,4
  265.  
  266.  
  267. hallo:            DC.B '
  268. p PRTKL881 - Softwareprotokoll für M68881 - Version 1.0'
  269.                   DC.B 'q
  270. entwickelt von Volker Hemsen, August 1993, Public Domain'
  271.                   DC.B '
  272. ',0
  273.  
  274.                   BSS
  275. register:
  276. datenreg:         DS.L 8                  ;Platz für 8 Datenregister
  277. adressreg:        DS.L 7                  ;Platz für 7 Adreßregister
  278. adressreg_sp:     DS.L 1                  ;Platz für korrigierten Stackpointer
  279. op_pc:            DS.L 1                  ;Programmcounter bei Exeption
  280.  
  281.  
  282.                   END
  283.